home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #12 / Amiga Plus CD - 2002 - No. 12.iso / Tools / Development / qstat25b / qstat.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-11-18  |  61.1 KB  |  1,854 lines

  1. /*
  2.  * qstat.h
  3.  * by Steve Jankowski
  4.  * steve@qstat.org
  5.  * http://www.qstat.org
  6.  *
  7.  * Copyright 1996,1997,1998,1999 by Steve Jankowski
  8.  */
  9.  
  10. #ifdef _WIN32
  11. #else
  12. #define _ISUNIX
  13. #endif
  14.  
  15. #ifndef __H_QSTAT
  16. #define __H_QSTAT
  17.  
  18. #ifdef __EMX__
  19. #include <sys/select.h>
  20. #include <sys/param.h>
  21. #define strcasecmp stricmp
  22. #define strncasecmp strnicmp
  23. #endif
  24.  
  25.  
  26. #ifdef _ISUNIX
  27. #include <sys/time.h>
  28. #endif
  29.  
  30. #ifdef _WIN32
  31. #define FD_SETSIZE 256
  32. #include <winsock.h>
  33. #endif
  34.  
  35. /* Various magic numbers.
  36.  */
  37.  
  38. #define Q_DEFAULT_PORT            26000
  39. #define HEXEN2_DEFAULT_PORT        26900
  40. #define Q2_DEFAULT_PORT            27910
  41. #define Q3_DEFAULT_PORT            27960
  42. #define Q2_MASTER_DEFAULT_PORT        27900
  43. #define Q3_MASTER_DEFAULT_PORT        27950
  44. #define QW_DEFAULT_PORT            27500
  45. #define QW_MASTER_DEFAULT_PORT        27000
  46. #define HW_DEFAULT_PORT            26950
  47. #define UNREAL_DEFAULT_PORT        7777
  48. #define UNREAL_MASTER_DEFAULT_PORT    28900
  49. #define HALFLIFE_DEFAULT_PORT        27015
  50. #define HL_MASTER_DEFAULT_PORT        27010
  51. #define SIN_DEFAULT_PORT        22450
  52. #define SHOGO_DEFAULT_PORT        27888
  53. #define TRIBES_DEFAULT_PORT        28001
  54. #define TRIBES_MASTER_DEFAULT_PORT    28000
  55. #define BFRIS_DEFAULT_PORT        44001
  56. #define KINGPIN_DEFAULT_PORT        31510
  57. #define HERETIC2_DEFAULT_PORT        28910
  58. #define SOF_DEFAULT_PORT        28910
  59. #define GAMESPY_MASTER_DEFAULT_PORT    28900
  60. #define TRIBES2_DEFAULT_PORT        28000
  61. #define TRIBES2_MASTER_DEFAULT_PORT    28002
  62. #define DESCENT3_GAMESPY_DEFAULT_PORT    20142
  63. #define DESCENT3_DEFAULT_PORT        2092
  64. #define DESCENT3_MASTER_DEFAULT_PORT    3445
  65. #define RTCW_DEFAULT_PORT        27960
  66. #define RTCW_MASTER_DEFAULT_PORT    27950
  67. #define STEF_DEFAULT_PORT        27960
  68. #define STEF_MASTER_DEFAULT_PORT    27953
  69.  
  70. #define Q_UNKNOWN_TYPE 0
  71. #define MASTER_SERVER 0x40000000
  72.  
  73. #define Q_SERVER    1
  74. #define QW_SERVER    2
  75. #define QW_MASTER    (3 | MASTER_SERVER)
  76. #define H2_SERVER    4
  77. #define Q2_SERVER    5
  78. #define Q2_MASTER    (6|MASTER_SERVER)
  79. #define HW_SERVER    7
  80. #define UN_SERVER    8
  81. #define UN_MASTER    (9|MASTER_SERVER)
  82. #define HL_SERVER    10
  83. #define HL_MASTER    (11|MASTER_SERVER)
  84. #define SIN_SERVER    12
  85. #define SHOGO_SERVER    13
  86. #define TRIBES_SERVER    14
  87. #define TRIBES_MASTER    (15|MASTER_SERVER)
  88. #define Q3_SERVER    16
  89. #define Q3_MASTER    (17|MASTER_SERVER)
  90. #define BFRIS_SERVER    18
  91. #define KINGPIN_SERVER    19
  92. #define HERETIC2_SERVER    20
  93. #define SOF_SERVER    21
  94. #define GAMESPY_PROTOCOL_SERVER    22
  95. #define GAMESPY_MASTER    (23|MASTER_SERVER)
  96. #define TRIBES2_SERVER    24
  97. #define TRIBES2_MASTER    (25|MASTER_SERVER)
  98. #define DESCENT3_GAMESPY_SERVER    26
  99. #define DESCENT3_PXO_SERVER    27
  100. #define DESCENT3_SERVER    28
  101. #define DESCENT3_MASTER    (29|MASTER_SERVER)
  102. #define RTCW_SERVER    30
  103. #define RTCW_MASTER    (31|MASTER_SERVER)
  104. #define STEF_SERVER    32
  105. #define STEF_MASTER    (33|MASTER_SERVER)
  106.  
  107. #define LAST_BUILTIN_SERVER  33
  108.  
  109. #define TF_SINGLE_QUERY        (1<<1)
  110. #define TF_OUTFILE        (1<<2)
  111. #define TF_MASTER_MULTI_RESPONSE    (1<<3)
  112. #define TF_TCP_CONNECT        (1<<4)
  113. #define TF_QUERY_ARG        (1<<5)
  114. #define TF_QUERY_ARG_REQUIRED    (1<<6)
  115. #define TF_QUAKE3_NAMES        (1<<7)
  116. #define TF_TRIBES2_NAMES    (1<<8)
  117. #define TF_SOF_NAMES        (1<<9)
  118.  
  119. #define TF_RAW_STYLE_QUAKE    (1<<10)
  120. #define TF_RAW_STYLE_TRIBES    (1<<11)
  121.  
  122. #define TRIBES_TEAM    -1
  123.  
  124. struct qserver;
  125. struct q_packet;
  126.  
  127. typedef void (*DisplayFunc)( struct qserver *);
  128. typedef void (*QueryFunc)( struct qserver *);
  129. typedef void (*PacketFunc)( struct qserver *, char *rawpkt, int pktlen);
  130.  
  131. /* Output and formatting functions
  132.  */
  133.  
  134. void display_server( struct qserver *server);
  135. void display_qwmaster( struct qserver *server);
  136. void display_server_rules( struct qserver *server);
  137. void display_player_info( struct qserver *server);
  138. void display_q_player_info( struct qserver *server);
  139. void display_qw_player_info( struct qserver *server);
  140. void display_q2_player_info( struct qserver *server);
  141. void display_unreal_player_info( struct qserver *server);
  142. void display_shogo_player_info( struct qserver *server);
  143. void display_halflife_player_info( struct qserver *server);
  144. void display_tribes_player_info( struct qserver *server);
  145. void display_tribes2_player_info( struct qserver *server);
  146. void display_bfris_player_info( struct qserver *server);
  147. void display_descent3_player_info( struct qserver *server);
  148.  
  149. void raw_display_server( struct qserver *server);
  150. void raw_display_server_rules( struct qserver *server);
  151. void raw_display_player_info( struct qserver *server);
  152. void raw_display_q_player_info( struct qserver *server);
  153. void raw_display_qw_player_info( struct qserver *server);
  154. void raw_display_q2_player_info( struct qserver *server);
  155. void raw_display_unreal_player_info( struct qserver *server);
  156. void raw_display_halflife_player_info( struct qserver *server);
  157. void raw_display_tribes_player_info( struct qserver *server);
  158. void raw_display_tribes2_player_info( struct qserver *server);
  159. void raw_display_bfris_player_info( struct qserver *server);
  160. void raw_display_descent3_player_info( struct qserver *server);
  161.  
  162. void xml_display_server( struct qserver *server);
  163. void xml_header();
  164. void xml_footer();
  165. void xml_display_server_rules( struct qserver *server);
  166. void xml_display_player_info( struct qserver *server);
  167. void xml_display_q_player_info( struct qserver *server);
  168. void xml_display_qw_player_info( struct qserver *server);
  169. void xml_display_q2_player_info( struct qserver *server);
  170. void xml_display_unreal_player_info( struct qserver *server);
  171. void xml_display_halflife_player_info( struct qserver *server);
  172. void xml_display_tribes_player_info( struct qserver *server);
  173. void xml_display_tribes2_player_info( struct qserver *server);
  174. void xml_display_bfris_player_info( struct qserver *server);
  175. void xml_display_descent3_player_info( struct qserver *server);
  176. char *xml_escape( char*);
  177. char *str_replace( char *, char *, char *);
  178.  
  179. void send_server_request_packet( struct qserver *server);
  180. void send_qserver_request_packet( struct qserver *server);
  181. void send_qwserver_request_packet( struct qserver *server);
  182. void send_unreal_request_packet( struct qserver *server);
  183. void send_tribes_request_packet( struct qserver *server);
  184. void send_qwmaster_request_packet( struct qserver *server);
  185. void send_bfris_request_packet( struct qserver *server);
  186. void send_player_request_packet( struct qserver *server);
  187. void send_rule_request_packet( struct qserver *server);
  188. void send_gamespy_master_request( struct qserver *server);
  189. void send_tribes2_request_packet( struct qserver *server);
  190. void send_tribes2master_request_packet( struct qserver *server);
  191.  
  192. void deal_with_packet( struct qserver *server, char *pkt, int pktlen);
  193. void deal_with_q_packet( struct qserver *server, char *pkt, int pktlen);
  194. void deal_with_qw_packet( struct qserver *server, char *pkt, int pktlen);
  195. void deal_with_q1qw_packet( struct qserver *server, char *pkt, int pktlen);
  196. void deal_with_q2_packet( struct qserver *server, char *pkt, int pktlen,
  197.     int check_duplicate_rules);
  198. void deal_with_qwmaster_packet( struct qserver *server, char *pkt, int pktlen);
  199. void deal_with_halflife_packet( struct qserver *server, char *pkt, int pktlen);
  200. void deal_with_unreal_packet( struct qserver *server, char *pkt, int pktlen);
  201. void deal_with_tribes_packet( struct qserver *server, char *pkt, int pktlen);
  202. void deal_with_tribesmaster_packet( struct qserver *server, char *pkt, int pktlen);
  203. void deal_with_bfris_packet( struct qserver *server, char *pkt, int pktlen);
  204. void deal_with_gamespy_master_response( struct qserver *server, char *pkt, int pktlen);
  205. void deal_with_tribes2_packet( struct qserver *server, char *pkt, int pktlen);
  206. void deal_with_tribes2master_packet( struct qserver *server, char *pkt, int pktlen);
  207. void deal_with_descent3_packet( struct qserver *server, char *pkt, int pktlen);
  208. void deal_with_descent3master_packet( struct qserver *server, char *pkt, int pktlen);
  209.  
  210. typedef struct _server_type  {
  211.     int id;
  212.     char *type_prefix;
  213.     char *type_string;
  214.     char *type_option;
  215.     char *game_name;
  216.     int master;
  217.     unsigned short default_port;
  218.     short port_offset;
  219.     int flags;
  220.     char *game_rule;
  221.     char *template_var;
  222.     char *status_packet;
  223.     int status_len;
  224.     char *player_packet;
  225.     int player_len;
  226.     char *rule_packet;
  227.     int rule_len;
  228.     char *master_packet;
  229.     int master_len;
  230.     char *master_protocol;
  231.     char *master_query;
  232.     DisplayFunc display_player_func;
  233.     DisplayFunc display_rule_func;
  234.     DisplayFunc display_raw_player_func;
  235.     DisplayFunc display_raw_rule_func;
  236.     DisplayFunc display_xml_player_func;
  237.     DisplayFunc display_xml_rule_func;
  238.     QueryFunc status_query_func;
  239.     QueryFunc player_query_func;
  240.     QueryFunc rule_query_func;
  241.     PacketFunc packet_func;
  242. } server_type;
  243.  
  244. extern server_type builtin_types[];
  245. extern server_type *types;
  246. extern int n_server_types;
  247. extern server_type* default_server_type;
  248. server_type* find_server_type_string( char* type_string);
  249.  
  250.  
  251. #ifdef QUERY_PACKETS
  252. #undef QUERY_PACKETS
  253.  
  254. /* QUAKE */
  255. struct q_packet  {
  256.     unsigned char flag1;
  257.     unsigned char flag2;
  258.     unsigned short length;
  259.     unsigned char op_code;
  260.     unsigned char data[19];
  261. };
  262. #define Q_HEADER_LEN    5
  263.  
  264. /*
  265. struct {
  266.     unsigned char flag1;
  267.     unsigned char flag2;
  268.     unsigned short length;
  269.     unsigned char op_code;
  270.     char name[6];
  271.     unsigned char version;
  272. };
  273. */
  274.  
  275. #define Q_FLAG1            0x80
  276. #define Q_FLAG2            0x00
  277. #define Q_CCREQ_SERVER_INFO    0x02
  278. #define Q_CCREQ_PLAYER_INFO    0x03
  279. #define Q_CCREQ_RULE_INFO    0x04
  280.  
  281. /* The \003 below is the protocol version */
  282. #define Q_SERVERINFO_LEN    12
  283. struct q_packet q_serverinfo =
  284. { Q_FLAG1, Q_FLAG2, Q_SERVERINFO_LEN, Q_CCREQ_SERVER_INFO, "QUAKE\000\003" };
  285.  
  286. struct q_packet q_rule = {Q_FLAG1,Q_FLAG2, 0, Q_CCREQ_RULE_INFO, ""};
  287. struct q_packet q_player = {Q_FLAG1,Q_FLAG2, 6, Q_CCREQ_PLAYER_INFO, ""};
  288.  
  289. /* QUAKE WORLD */
  290. struct {
  291.     char prefix[4];
  292.     char command[7];
  293. } qw_serverstatus =
  294. { '\377', '\377', '\377', '\377', 's', 't', 'a', 't', 'u', 's', '\n' };
  295.  
  296. /* QUAKE3 */
  297. struct {
  298.     char prefix[4];
  299.     char command[10];
  300. } q3_serverstatus =
  301. { '\377', '\377', '\377', '\377', 'g', 'e', 't', 's', 't', 'a', 't', 'u', 's', '\n' };
  302.  
  303. struct {
  304.     char prefix[4];
  305.     char command[8];
  306. } q3_serverinfo =
  307. { '\377', '\377', '\377', '\377', 'g', 'e', 't', 'i', 'n', 'f', 'o', '\n' };
  308.  
  309. /* HEXEN WORLD */
  310. struct {
  311.     char prefix[5];
  312.     char command[7];
  313. } hw_serverstatus =
  314. { '\377', '\377', '\377', '\377', '\377', 's', 't', 'a', 't', 'u', 's', '\n' };
  315.  
  316. /* HEXEN 2 */
  317. /* The \004 below is the protocol version */
  318. #define H2_SERVERINFO_LEN    14
  319. struct q_packet h2_serverinfo =
  320. { Q_FLAG1, Q_FLAG2, H2_SERVERINFO_LEN, Q_CCREQ_SERVER_INFO, "HEXENII\000\004" };
  321.  
  322. /* UNREAL */
  323.  
  324. char unreal_serverstatus[8] = { '\\', 's','t','a','t','u','s', '\\' };
  325.  
  326. /*
  327. char unreal_serverstatus[] = { '\\', 's','t','a','t','u','s', '\\', '\\', 'p','l','a','y','e','r','s', '\\', '\\' };
  328. */
  329. char unreal_masterlist[23] = "\\list\\\\gamename\\unreal";
  330.  
  331. /* HALF LIFE */
  332. char hl_ping[9] =
  333. { '\377', '\377', '\377', '\377', 'p', 'i', 'n', 'g', '\0' };
  334. char hl_rules[10] =
  335. { '\377', '\377', '\377', '\377', 'r', 'u', 'l', 'e', 's', '\0' };
  336. char hl_info[9] =
  337. { '\377', '\377', '\377', '\377', 'i', 'n', 'f', 'o', '\0' };
  338. char hl_players[12] =
  339. { '\377', '\377', '\377', '\377', 'p', 'l', 'a', 'y', 'e', 'r', 's', '\0' };
  340. char hl_details[12] =
  341. { '\377', '\377', '\377', '\377', 'd', 'e', 't', 'a', 'i', 'l', 's', '\0' };
  342.  
  343. /* QUAKE WORLD MASTER */
  344. #define QW_GET_SERVERS    'c'
  345. char qw_masterquery[] = { QW_GET_SERVERS, '\n', '\0' };
  346.  
  347. /* QUAKE 2 MASTER */
  348. char q2_masterquery[] = { 'q', 'u', 'e', 'r', 'y', '\n', '\0' };
  349.  
  350. /* QUAKE 3 MASTER */
  351. char q3_master_query_template[] = "\377\377\377\377getservers %s %s";
  352. char q3_master_default_protocol[] = "67";
  353. char q3_master_default_query[] = "empty full demo\n";
  354.  
  355. /* RETURN TO CASTLE WOLFENSTEIN */
  356. char rtcw_master_default_protocol[] = "58";
  357.  
  358. /* STAR TREK: ELITE FORCE */
  359. char stef_master_default_protocol[] = "24";
  360.  
  361. /* HALF-LIFE MASTER */
  362. char hl_masterquery[4] = { 'e', '\0', '\0', '\0' };
  363. char new_hl_masterquery_prefix[5] = { '1', '\0', '\0', '\0', '\0' };
  364.  
  365. /* TRIBES */
  366. char tribes_info[] = { '`', '*', '*' };
  367. char tribes_players[] = { 'b', '*', '*' };
  368. /*  This is what the game sends to get minimal status
  369. { '\020', '\03', '\377', 0, (unsigned char)0xc5, 6 };
  370. */
  371. char tribes_info_reponse[] = { 'a', '*', '*', 'b' };
  372. char tribes_players_reponse[] = { 'c', '*', '*', 'b' };
  373. char tribes_masterquery[] = { 0x10, 0x3, '\377', 0, 0x2 };
  374. char tribes_master_response[] = { 0x10, 0x6 };
  375.  
  376. /* GAMESPY */
  377. char gamespy_master_request_prefix[] = "\\list\\\\gamename\\";
  378. char gamespy_master_validate[] = "\\gamename\\gamespy2\\gamever\\020109017\\location\\5\\validate\\12345678\\final\\";
  379.  
  380. /* TRIBES 2 */
  381. #define TRIBES2_QUERY_GAME_TYPES    2
  382. #define TRIBES2_QUERY_MASTER        6
  383. #define TRIBES2_QUERY_PING        14
  384. #define TRIBES2_QUERY_INFO        18
  385. #define TRIBES2_RESPONSE_GAME_TYPES    4
  386. #define TRIBES2_RESPONSE_MASTER        8
  387. #define TRIBES2_RESPONSE_PING        16
  388. #define TRIBES2_RESPONSE_INFO        20
  389.  
  390. #define TRIBES2_NO_COMPRESS        2
  391. #define TRIBES2_DEFAULT_PACKET_INDEX    255
  392. #define TRIBES2_STATUS_DEDICATED    (1<<0)
  393. #define TRIBES2_STATUS_PASSWORD        (1<<1)
  394. #define TRIBES2_STATUS_LINUX        (1<<2)
  395. #define TRIBES2_STATUS_TOURNAMENT    (1<<3)
  396. #define TRIBES2_STATUS_NOALIAS        (1<<4)
  397. #define TRIBES2_STATUS_TEAMDAMAGE    (1<<5)
  398. #define TRIBES2_STATUS_TOURNAMENT_VER3    (1<<6)
  399. #define TRIBES2_STATUS_NOALIAS_VER3    (1<<7)
  400. char tribes2_game_types_request[] = { TRIBES2_QUERY_GAME_TYPES, 0, 1,2,3,4 };
  401. char tribes2_ping[] = { TRIBES2_QUERY_PING, TRIBES2_NO_COMPRESS, 1,2,3,4 };
  402. char tribes2_info[] = { TRIBES2_QUERY_INFO, TRIBES2_NO_COMPRESS, 1,2,3,4 };
  403. unsigned char tribes2_masterquery[] = {
  404.     TRIBES2_QUERY_MASTER, 128,    /* <= build 22228, this was 0 */
  405.     11,12,13,14,
  406.     255,
  407.     3, 'a', 'n', 'y',
  408.     3, 'a', 'n', 'y',
  409.     0, 255,                /* min/max players */
  410.     0xff, 0xff, 0xff, 0xff,        /* region mask */
  411.     0, 0, 0, 0,             /* build version */
  412.     0,                /* status */
  413.     255,                /* max bots */
  414.     0, 0,                /* min cpu */
  415.     0                /* # buddies */
  416.     };
  417. #define TRIBES2_ID_OFFSET    2
  418.  
  419. unsigned char descent3_masterquery[] = {
  420.     0x03, /* ID or something */
  421.     0x24, 0x00, 0x00, 0x00, /* packet len */
  422.     0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  423.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /* unknown */
  424.     0x07, /* type */
  425.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* unknown */
  426.     0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x00  /* "global" */
  427. };
  428.  
  429. /* for some reason Descent3 uses a different request for pxo/non-pxo games. blah. */
  430. unsigned char descent3_pxoinfoquery[] = {
  431.     0x01, /* "internal descent3 routing" */
  432.     0x29, /* request server info? (pxo listed servers) */
  433.     0x0b, 0x00, /* packet length (- routing byte) */
  434.     0x1b, 0x2f, 0xf4, 0x41, 0x09, 0x00, 0x00, 0x00 /* unknown */
  435. };
  436. unsigned char descent3_tcpipinfoquery[] = {
  437.     0x01, /* "internal descent3 routing" */
  438.     0x1e, /* request server info? (tcpip only servers) */
  439.     0x0b, 0x00, /* packet length (- routing byte) */
  440.     0x1b, 0x2f, 0xf4, 0x41, 0x09, 0x00, 0x00, 0x00 /* unknown */
  441. };
  442. /* http://ml.warpcore.org/d3dl/200101/msg00001.html
  443.  * http://ml.warpcore.org/d3dl/200101/msg00004.html */
  444. unsigned char descent3_playerquery[] = {
  445.     0x01, /* "internal descent3 routing" */
  446.     0x72, /* MP_REQUEST_PLAYERLIST   */
  447.     0x03, 0x00 /* packet length (- routing byte) */
  448. };
  449.  
  450.  
  451. server_type builtin_types[] = {
  452. {
  453.     /* QUAKE */
  454.     Q_SERVER,            /* id */
  455.     "QS",            /* type_prefix */
  456.     "qs",            /* type_string */
  457.     "-qs",            /* type_option */
  458.     "Quake",            /* game_name */
  459.     0,                /* master */
  460.     Q_DEFAULT_PORT,        /* default_port */
  461.     0,                /* port_offset */
  462.     TF_RAW_STYLE_QUAKE,        /* flags */
  463.     "*gamedir",            /* game_rule */
  464.     "QUAKE",            /* template_var */
  465.     (char*) &q_serverinfo,    /* status_packet */
  466.     Q_SERVERINFO_LEN,        /* status_len */
  467.     (char*) &q_player,        /* player_packet */
  468.     Q_HEADER_LEN+1,        /* player_len */
  469.     (char*) &q_rule,        /* rule_packet */
  470.     sizeof( q_rule),        /* rule_len */
  471.     NULL,            /* master_packet */
  472.     0,                /* master_len */
  473.     NULL,            /* master_protocol */
  474.     NULL,            /* master_query */
  475.     display_q_player_info,    /* display_player_func */
  476.     display_server_rules,    /* display_rule_func */
  477.     raw_display_q_player_info,    /* display_raw_player_func */
  478.     raw_display_server_rules,    /* display_raw_rule_func */
  479.     xml_display_q_player_info,    /* display_xml_player_func */
  480.     xml_display_server_rules,    /* display_xml_rule_func */
  481.     send_qserver_request_packet,/* status_query_func */
  482.     send_player_request_packet,    /* rule_query_func */
  483.     send_rule_request_packet,    /* player_query_func */
  484.     deal_with_q_packet,        /* packet_func */
  485. },
  486. {
  487.     /* HEXEN 2 */
  488.     H2_SERVER,            /* id */
  489.     "H2S",            /* type_prefix */
  490.     "h2s",            /* type_string */
  491.     "-h2s",            /* type_option */
  492.     "Hexen II",            /* game_name */
  493.     0,                /* master */
  494.     HEXEN2_DEFAULT_PORT,    /* default_port */
  495.     0,                /* port_offset */
  496.     TF_RAW_STYLE_QUAKE,        /* flags */
  497.     "*gamedir",            /* game_rule */
  498.     "HEXEN2",            /* template_var */
  499.     (char*) &h2_serverinfo,    /* status_packet */
  500.     H2_SERVERINFO_LEN,        /* status_len */
  501.     (char*) &q_player,        /* player_packet */
  502.     Q_HEADER_LEN+1,        /* player_len */
  503.     (char*) &q_rule,        /* rule_packet */
  504.     sizeof( q_rule),        /* rule_len */
  505.     NULL,            /* master_packet */
  506.     0,                /* master_len */
  507.     NULL,            /* master_protocol */
  508.     NULL,            /* master_query */
  509.     display_q_player_info,    /* display_player_func */
  510.     display_server_rules,    /* display_rule_func */
  511.     raw_display_q_player_info,    /* display_raw_player_func */
  512.     raw_display_server_rules,    /* display_raw_rule_func */
  513.     xml_display_q_player_info,    /* display_xml_player_func */
  514.     xml_display_server_rules,    /* display_xml_rule_func */
  515.     send_qserver_request_packet,/* status_query_func */
  516.     send_player_request_packet,    /* rule_query_func */
  517.     send_rule_request_packet,    /* player_query_func */
  518.     deal_with_q_packet,        /* packet_func */
  519. },
  520. {
  521.     /* QUAKE WORLD */
  522.     QW_SERVER,            /* id */
  523.     "QWS",            /* type_prefix */
  524.     "qws",            /* type_string */
  525.     "-qws",            /* type_option */
  526.     "QuakeWorld",        /* game_name */
  527.     0,                /* master */
  528.     QW_DEFAULT_PORT,        /* default_port */
  529.     0,                /* port_offset */
  530.     TF_SINGLE_QUERY,        /* flags */
  531.     "*gamedir",            /* game_rule */
  532.     "QUAKEWORLD",        /* template_var */
  533.     (char*) &qw_serverstatus,    /* status_packet */
  534.     sizeof( qw_serverstatus),    /* status_len */
  535.     NULL,            /* player_packet */
  536.     0,                /* player_len */
  537.     NULL,            /* rule_packet */
  538.     0,                /* rule_len */
  539.     NULL,            /* master_packet */
  540.     0,                /* master_len */
  541.     NULL,            /* master_protocol */
  542.     NULL,            /* master_query */
  543.     display_qw_player_info,    /* display_player_func */
  544.     display_server_rules,    /* display_rule_func */
  545.     raw_display_qw_player_info,    /* display_raw_player_func */
  546.     raw_display_server_rules,    /* display_raw_rule_func */
  547.     xml_display_qw_player_info,    /* display_xml_player_func */
  548.     xml_display_server_rules,    /* display_xml_rule_func */
  549.     send_qwserver_request_packet,/* status_query_func */
  550.     NULL,            /* rule_query_func */
  551.     NULL,            /* player_query_func */
  552.     deal_with_qw_packet,    /* packet_func */
  553. },
  554. {
  555.     /* HEXEN WORLD */
  556.     HW_SERVER,            /* id */
  557.     "HWS",            /* type_prefix */
  558.     "hws",            /* type_string */
  559.     "-hws",            /* type_option */
  560.     "HexenWorld",        /* game_name */
  561.     0,                /* master */
  562.     HW_DEFAULT_PORT,        /* default_port */
  563.     0,                /* port_offset */
  564.     TF_SINGLE_QUERY,        /* flags */
  565.     "*gamedir",            /* game_rule */
  566.     "HEXENWORLD",        /* template_var */
  567.     (char*) &hw_serverstatus,    /* status_packet */
  568.     sizeof( hw_serverstatus),    /* status_len */
  569.     NULL,            /* player_packet */
  570.     0,                /* player_len */
  571.     NULL,            /* rule_packet */
  572.     0,                /* rule_len */
  573.     NULL,            /* master_packet */
  574.     0,                /* master_len */
  575.     NULL,            /* master_protocol */
  576.     NULL,            /* master_query */
  577.     display_qw_player_info,    /* display_player_func */
  578.     display_server_rules,    /* display_rule_func */
  579.     raw_display_qw_player_info,    /* display_raw_player_func */
  580.     raw_display_server_rules,    /* display_raw_rule_func */
  581.     xml_display_qw_player_info,    /* display_xml_player_func */
  582.     xml_display_server_rules,    /* display_xml_rule_func */
  583.     send_qwserver_request_packet,/* status_query_func */
  584.     NULL,            /* rule_query_func */
  585.     NULL,            /* player_query_func */
  586.     deal_with_qw_packet,    /* packet_func */
  587. },
  588. {
  589.     /* QUAKE 2 */
  590.     Q2_SERVER,            /* id */
  591.     "Q2S",            /* type_prefix */
  592.     "q2s",            /* type_string */
  593.     "-q2s",            /* type_option */
  594.     "Quake II",            /* game_name */
  595.     0,                /* master */
  596.     Q2_DEFAULT_PORT,        /* default_port */
  597.     0,                /* port_offset */
  598.     TF_SINGLE_QUERY,        /* flags */
  599.     "gamedir",            /* game_rule */
  600.     "QUAKE2",            /* template_var */
  601.     (char*) &qw_serverstatus,    /* status_packet */
  602.     sizeof( qw_serverstatus),    /* status_len */
  603.     NULL,            /* player_packet */
  604.     0,                /* player_len */
  605.     NULL,            /* rule_packet */
  606.     0,                /* rule_len */
  607.     NULL,            /* master_packet */
  608.     0,                /* master_len */
  609.     NULL,            /* master_protocol */
  610.     NULL,            /* master_query */
  611.     display_q2_player_info,    /* display_player_func */
  612.     display_server_rules,    /* display_rule_func */
  613.     raw_display_q2_player_info,    /* display_raw_player_func */
  614.     raw_display_server_rules,    /* display_raw_rule_func */
  615.     xml_display_q2_player_info,    /* display_xml_player_func */
  616.     xml_display_server_rules,    /* display_xml_rule_func */
  617.     send_qwserver_request_packet,/* status_query_func */
  618.     NULL,            /* rule_query_func */
  619.     NULL,            /* player_query_func */
  620.     deal_with_qw_packet,    /* packet_func */
  621. },
  622. {
  623.     /* QUAKE 3 */
  624.     Q3_SERVER,            /* id */
  625.     "Q3S",            /* type_prefix */
  626.     "q3s",            /* type_string */
  627.     "-q3s",            /* type_option */
  628.     "Quake III: Arena",        /* game_name */
  629.     0,                /* master */
  630.     Q3_DEFAULT_PORT,        /* default_port */
  631.     0,                /* port_offset */
  632.     TF_QUAKE3_NAMES /* TF_SINGLE_QUERY */,        /* flags */
  633.     "game",            /* game_rule */
  634.     "QUAKE3",            /* template_var */
  635.     (char*) &q3_serverinfo,    /* status_packet */
  636.     sizeof( q3_serverinfo),    /* status_len */
  637.     NULL,            /* player_packet */
  638.     0,                /* player_len */
  639.     (char*) &q3_serverstatus,    /* rule_packet */
  640.     sizeof( q3_serverstatus),    /* rule_len */
  641.     NULL,            /* master_packet */
  642.     0,                /* master_len */
  643.     NULL,            /* master_protocol */
  644.     NULL,            /* master_query */
  645.     display_q2_player_info,    /* display_player_func */
  646.     display_server_rules,    /* display_rule_func */
  647.     raw_display_q2_player_info,    /* display_raw_player_func */
  648.     raw_display_server_rules,    /* display_raw_rule_func */
  649.     xml_display_q2_player_info,    /* display_xml_player_func */
  650.     xml_display_server_rules,    /* display_xml_rule_func */
  651.     send_qwserver_request_packet,/* status_query_func */
  652.     NULL,            /* rule_query_func */
  653.     NULL,            /* player_query_func */
  654.     deal_with_qw_packet,    /* packet_func */
  655. },
  656. {
  657.     /* RETURN TO CASTLE WOLFENSTEIN */
  658.     RTCW_SERVER,        /* id */
  659.     "RWS",            /* type_prefix */
  660.     "rws",            /* type_string */
  661.     "-rws",            /* type_option */
  662.     "Return to Castle Wolfenstein",    /* game_name */
  663.     0,                /* master */
  664.     RTCW_DEFAULT_PORT,        /* default_port */
  665.     0,                /* port_offset */
  666.     TF_QUAKE3_NAMES /* TF_SINGLE_QUERY */,        /* flags */
  667.     "game",            /* game_rule */
  668.     "RTCW",            /* template_var */
  669.     (char*) &q3_serverinfo,    /* status_packet */
  670.     sizeof( q3_serverinfo),    /* status_len */
  671.     NULL,            /* player_packet */
  672.     0,                /* player_len */
  673.     (char*) &q3_serverstatus,    /* rule_packet */
  674.     sizeof( q3_serverstatus),    /* rule_len */
  675.     NULL,            /* master_packet */
  676.     0,                /* master_len */
  677.     NULL,            /* master_protocol */
  678.     NULL,            /* master_query */
  679.     display_q2_player_info,    /* display_player_func */
  680.     display_server_rules,    /* display_rule_func */
  681.     raw_display_q2_player_info,    /* display_raw_player_func */
  682.     raw_display_server_rules,    /* display_raw_rule_func */
  683.     xml_display_q2_player_info,    /* display_xml_player_func */
  684.     xml_display_server_rules,    /* display_xml_rule_func */
  685.     send_qwserver_request_packet,/* status_query_func */
  686.     NULL,            /* rule_query_func */
  687.     NULL,            /* player_query_func */
  688.     deal_with_qw_packet,    /* packet_func */
  689. },
  690. {
  691.     /* STAR TREK: ELITE FORCE */
  692.     STEF_SERVER,        /* id */
  693.     "EFS",            /* type_prefix */
  694.     "efs",            /* type_string */
  695.     "-efs",            /* type_option */
  696.     "Star Trek: Elite Force",    /* game_name */
  697.     0,                /* master */
  698.     STEF_DEFAULT_PORT,        /* default_port */
  699.     0,                /* port_offset */
  700.     TF_QUAKE3_NAMES /* TF_SINGLE_QUERY */,        /* flags */
  701.     "game",            /* game_rule */
  702.     "ELITEFORCE",        /* template_var */
  703.     (char*) &q3_serverinfo,    /* status_packet */
  704.     sizeof( q3_serverinfo),    /* status_len */
  705.     NULL,            /* player_packet */
  706.     0,                /* player_len */
  707.     (char*) &q3_serverstatus,    /* rule_packet */
  708.     sizeof( q3_serverstatus),    /* rule_len */
  709.     NULL,            /* master_packet */
  710.     0,                /* master_len */
  711.     NULL,            /* master_protocol */
  712.     NULL,            /* master_query */
  713.     display_q2_player_info,    /* display_player_func */
  714.     display_server_rules,    /* display_rule_func */
  715.     raw_display_q2_player_info,    /* display_raw_player_func */
  716.     raw_display_server_rules,    /* display_raw_rule_func */
  717.     xml_display_q2_player_info,    /* display_xml_player_func */
  718.     xml_display_server_rules,    /* display_xml_rule_func */
  719.     send_qwserver_request_packet,/* status_query_func */
  720.     NULL,            /* rule_query_func */
  721.     NULL,            /* player_query_func */
  722.     deal_with_qw_packet,    /* packet_func */
  723. },
  724. {
  725.     /* UNREAL */
  726.     UN_SERVER,            /* id */
  727.     "UNS",            /* type_prefix */
  728.     "uns",            /* type_string */
  729.     "-uns",            /* type_option */
  730.     "Unreal",            /* game_name */
  731.     0,                /* master */
  732.     UNREAL_DEFAULT_PORT,    /* default_port */
  733.     1,                /* port_offset */
  734.     TF_SINGLE_QUERY,        /* flags */
  735.     "gametype",            /* game_rule */
  736.     "UNREAL",            /* template_var */
  737.     (char*) &unreal_serverstatus,    /* status_packet */
  738.     sizeof( unreal_serverstatus),    /* status_len */
  739.     NULL,            /* player_packet */
  740.     0,                /* player_len */
  741.     NULL,            /* rule_packet */
  742.     0,                /* rule_len */
  743.     NULL,            /* master_packet */
  744.     0,                /* master_len */
  745.     NULL,            /* master_protocol */
  746.     NULL,            /* master_query */
  747.     display_unreal_player_info,    /* display_player_func */
  748.     display_server_rules,    /* display_rule_func */
  749.     raw_display_unreal_player_info,    /* display_raw_player_func */
  750.     raw_display_server_rules,    /* display_raw_rule_func */
  751.     xml_display_unreal_player_info,    /* display_xml_player_func */
  752.     xml_display_server_rules,    /* display_xml_rule_func */
  753.     send_unreal_request_packet,    /* status_query_func */
  754.     NULL,            /* rule_query_func */
  755.     NULL,            /* player_query_func */
  756.     deal_with_unreal_packet,    /* packet_func */
  757. },
  758. {
  759.     /* HALF LIFE */
  760.     HL_SERVER,            /* id */
  761.     "HLS",            /* type_prefix */
  762.     "hls",            /* type_string */
  763.     "-hls",            /* type_option */
  764.     "Half-Life",        /* game_name */
  765.     0,                /* master */
  766.     HALFLIFE_DEFAULT_PORT,    /* default_port */
  767.     0,                /* port_offset */
  768.     0,                /* flags */
  769.     "game",            /* game_rule */
  770.     "HALFLIFE",            /* template_var */
  771.     (char*) &hl_details,        /* status_packet */
  772.     sizeof( hl_details),        /* status_len */
  773.     (char*) &hl_players,    /* player_packet */
  774.     sizeof( hl_players),    /* player_len */
  775.     (char*) &hl_rules,        /* rule_packet */
  776.     sizeof( hl_rules),        /* rule_len */
  777.     NULL,            /* master_packet */
  778.     0,                /* master_len */
  779.     NULL,            /* master_protocol */
  780.     NULL,            /* master_query */
  781.     display_halflife_player_info,/* display_player_func */
  782.     display_server_rules,    /* display_rule_func */
  783.     raw_display_halflife_player_info,    /* display_raw_player_func */
  784.     raw_display_server_rules,    /* display_raw_rule_func */
  785.     xml_display_halflife_player_info,    /* display_xml_player_func */
  786.     xml_display_server_rules,    /* display_xml_rule_func */
  787.     send_qwserver_request_packet,/* status_query_func */
  788.     send_rule_request_packet,    /* rule_query_func */
  789.     send_player_request_packet,    /* player_query_func */
  790.     deal_with_halflife_packet,    /* packet_func */
  791. },
  792. {
  793.     /* SIN */
  794.     SIN_SERVER,            /* id */
  795.     "SNS",            /* type_prefix */
  796.     "sns",            /* type_string */
  797.     "-sns",            /* type_option */
  798.     "Sin",            /* game_name */
  799.     0,                /* master */
  800.     SIN_DEFAULT_PORT,        /* default_port */
  801.     0,                /* port_offset */
  802.     TF_SINGLE_QUERY,        /* flags */
  803.     "gamedir",            /* game_rule */
  804.     "SIN",            /* template_var */
  805.     (char*) &qw_serverstatus,    /* status_packet */
  806.     sizeof( qw_serverstatus),    /* status_len */
  807.     NULL,            /* player_packet */
  808.     0,                /* player_len */
  809.     NULL,            /* rule_packet */
  810.     0,                /* rule_len */
  811.     NULL,            /* master_packet */
  812.     0,                /* master_len */
  813.     NULL,            /* master_protocol */
  814.     NULL,            /* master_query */
  815.     display_q2_player_info,    /* display_player_func */
  816.     display_server_rules,    /* display_rule_func */
  817.     raw_display_q2_player_info,    /* display_raw_player_func */
  818.     raw_display_server_rules,    /* display_raw_rule_func */
  819.     xml_display_q2_player_info,    /* display_xml_player_func */
  820.     xml_display_server_rules,    /* display_xml_rule_func */
  821.     send_qwserver_request_packet,/* status_query_func */
  822.     NULL,            /* rule_query_func */
  823.     NULL,            /* player_query_func */
  824.     deal_with_qw_packet,    /* packet_func */
  825. },
  826. {
  827.     /* SHOGO */
  828.     SHOGO_SERVER,        /* id */
  829.     "SGS",            /* type_prefix */
  830.     "sgs",            /* type_string */
  831.     "-sgs",            /* type_option */
  832.     "Shogo: Mobile Armor Division",    /* game_name */
  833.     0,                /* master */
  834.     SHOGO_DEFAULT_PORT,        /* default_port */
  835.     0,                /* port_offset */
  836.     0,                /* flags */
  837.     "",                /* game_rule */
  838.     "SHOGO",            /* template_var */
  839.     (char*) &unreal_serverstatus,    /* status_packet */
  840.     sizeof( unreal_serverstatus),    /* status_len */
  841.     NULL,            /* player_packet */
  842.     0,                /* player_len */
  843.     NULL,            /* rule_packet */
  844.     0,                /* rule_len */
  845.     NULL,            /* master_packet */
  846.     0,                /* master_len */
  847.     NULL,            /* master_protocol */
  848.     NULL,            /* master_query */
  849.     display_q2_player_info,    /* display_player_func */
  850.     display_server_rules,    /* display_rule_func */
  851.     raw_display_q2_player_info,    /* display_raw_player_func */
  852.     raw_display_server_rules,    /* display_raw_rule_func */
  853.     xml_display_q2_player_info,    /* display_xml_player_func */
  854.     xml_display_server_rules,    /* display_xml_rule_func */
  855.     send_unreal_request_packet,    /* status_query_func */
  856.     NULL,            /* rule_query_func */
  857.     NULL,            /* player_query_func */
  858.     deal_with_unreal_packet,    /* packet_func */
  859. },
  860. {
  861.     /* TRIBES */
  862.     TRIBES_SERVER,        /* id */
  863.     "TBS",            /* type_prefix */
  864.     "tbs",            /* type_string */
  865.     "-tbs",            /* type_option */
  866.     "Tribes",            /* game_name */
  867.     0,                /* master */
  868.     TRIBES_DEFAULT_PORT,    /* default_port */
  869.     0,                /* port_offset */
  870.     TF_SINGLE_QUERY | TF_RAW_STYLE_TRIBES,        /* flags */
  871.     "game",            /* game_rule */
  872.     "TRIBES",            /* template_var */
  873.     (char*) &tribes_info,    /* status_packet */
  874.     sizeof( tribes_info),    /* status_len */
  875.     (char*) &tribes_players,    /* player_packet */
  876.     sizeof( tribes_players),    /* player_len */
  877.     (char*) &tribes_players,    /* rule_packet */
  878.     sizeof( tribes_players),    /* rule_len */
  879.     NULL,            /* master_packet */
  880.     0,                /* master_len */
  881.     NULL,            /* master_protocol */
  882.     NULL,            /* master_query */
  883.     display_tribes_player_info,    /* display_player_func */
  884.     display_server_rules,    /* display_rule_func */
  885.     raw_display_tribes_player_info,    /* display_raw_player_func */
  886.     raw_display_server_rules,    /* display_raw_rule_func */
  887.     xml_display_tribes_player_info,    /* display_xml_player_func */
  888.     xml_display_server_rules,    /* display_xml_rule_func */
  889.     send_tribes_request_packet,    /* status_query_func */
  890.     NULL,            /* rule_query_func */
  891.     NULL,            /* player_query_func */
  892.     deal_with_tribes_packet,    /* packet_func */
  893. },
  894. {
  895.     /* BFRIS */
  896.     BFRIS_SERVER,        /* id */
  897.     "BFS",            /* type_prefix */
  898.     "bfs",            /* type_string */
  899.     "-bfs",            /* type_option */
  900.     "BFRIS",            /* game_name */
  901.     0,                /* master */
  902.     BFRIS_DEFAULT_PORT,        /* default_port */
  903.     0,                /* port_offset */
  904.     TF_TCP_CONNECT,        /* flags */
  905.     "Rules",            /* game_rule */
  906.     "BFRIS",            /* template_var */
  907.     NULL,            /* status_packet */
  908.     0,                /* status_len */
  909.     NULL,            /* player_packet */
  910.     0,                /* player_len */
  911.     NULL,            /* rule_packet */
  912.     0,                /* rule_len */
  913.     NULL,            /* master_packet */
  914.     0,                /* master_len */
  915.     NULL,            /* master_protocol */
  916.     NULL,            /* master_query */
  917.     display_bfris_player_info,    /* display_player_func */
  918.     display_server_rules,    /* display_rule_func */
  919.     raw_display_bfris_player_info,/* display_raw_player_func */
  920.     raw_display_server_rules,    /* display_raw_rule_func */
  921.     xml_display_bfris_player_info,    /* display_xml_player_func */
  922.     xml_display_server_rules,    /* display_xml_rule_func */
  923.     send_bfris_request_packet,    /* status_query_func */
  924.     NULL,            /* rule_query_func */
  925.     NULL,            /* player_query_func */
  926.     deal_with_bfris_packet,    /* packet_func */
  927. },
  928. {
  929.     /* KINGPIN */
  930.     KINGPIN_SERVER,        /* id */
  931.     "KPS",            /* type_prefix */
  932.     "kps",            /* type_string */
  933.     "-kps",            /* type_option */
  934.     "Kingpin",            /* game_name */
  935.     0,                /* master */
  936.     KINGPIN_DEFAULT_PORT,    /* default_port */
  937.     0,                /* port_offset */
  938.     TF_SINGLE_QUERY,        /* flags */
  939.     "gamedir",            /* game_rule */
  940.     "KINGPIN",            /* template_var */
  941.     (char*) &qw_serverstatus,    /* status_packet */
  942.     sizeof( qw_serverstatus),    /* status_len */
  943.     NULL,            /* player_packet */
  944.     0,                /* player_len */
  945.     NULL,            /* rule_packet */
  946.     0,                /* rule_len */
  947.     NULL,            /* master_packet */
  948.     0,                /* master_len */
  949.     NULL,            /* master_protocol */
  950.     NULL,            /* master_query */
  951.     display_q2_player_info,    /* display_player_func */
  952.     display_server_rules,    /* display_rule_func */
  953.     raw_display_q2_player_info,    /* display_raw_player_func */
  954.     raw_display_server_rules,    /* display_raw_rule_func */
  955.     xml_display_q2_player_info,    /* display_xml_player_func */
  956.     xml_display_server_rules,    /* display_xml_rule_func */
  957.     send_qwserver_request_packet,/* status_query_func */
  958.     NULL,            /* rule_query_func */
  959.     NULL,            /* player_query_func */
  960.     deal_with_qw_packet,    /* packet_func */
  961. },
  962. {
  963.     /* HERETIC II */
  964.     HERETIC2_SERVER,        /* id */
  965.     "HRS",            /* type_prefix */
  966.     "hrs",            /* type_string */
  967.     "-hrs",            /* type_option */
  968.     "Heretic II",        /* game_name */
  969.     0,                /* master */
  970.     HERETIC2_DEFAULT_PORT,    /* default_port */
  971.     0,                /* port_offset */
  972.     TF_SINGLE_QUERY,        /* flags */
  973.     "gamedir",            /* game_rule */
  974.     "HERETIC2",            /* template_var */
  975.     (char*) &qw_serverstatus,    /* status_packet */
  976.     sizeof( qw_serverstatus),    /* status_len */
  977.     NULL,            /* player_packet */
  978.     0,                /* player_len */
  979.     NULL,            /* rule_packet */
  980.     0,                /* rule_len */
  981.     NULL,            /* master_packet */
  982.     0,                /* master_len */
  983.     NULL,            /* master_protocol */
  984.     NULL,            /* master_query */
  985.     display_q2_player_info,    /* display_player_func */
  986.     display_server_rules,    /* display_rule_func */
  987.     raw_display_q2_player_info,    /* display_raw_player_func */
  988.     raw_display_server_rules,    /* display_raw_rule_func */
  989.     xml_display_q2_player_info,    /* display_xml_player_func */
  990.     xml_display_server_rules,    /* display_xml_rule_func */
  991.     send_qwserver_request_packet,/* status_query_func */
  992.     NULL,            /* rule_query_func */
  993.     NULL,            /* player_query_func */
  994.     deal_with_qw_packet,    /* packet_func */
  995. },
  996. {
  997.     /* SOLDIER OF FORTUNE */
  998.     SOF_SERVER,            /* id */
  999.     "SFS",            /* type_prefix */
  1000.     "sfs",            /* type_string */
  1001.     "-sfs",            /* type_option */
  1002.     "Soldier of Fortune",    /* game_name */
  1003.     0,                /* master */
  1004.     SOF_DEFAULT_PORT,        /* default_port */
  1005.     0,                /* port_offset */
  1006.     TF_SINGLE_QUERY,        /* flags */
  1007.     "gamedir",            /* game_rule */
  1008.     "SOLDIEROFFORTUNE",        /* template_var */
  1009.     (char*) &qw_serverstatus,    /* status_packet */
  1010.     sizeof( qw_serverstatus),    /* status_len */
  1011.     NULL,            /* player_packet */
  1012.     0,                /* player_len */
  1013.     NULL,            /* rule_packet */
  1014.     0,                /* rule_len */
  1015.     NULL,            /* master_packet */
  1016.     0,                /* master_len */
  1017.     NULL,            /* master_protocol */
  1018.     NULL,            /* master_query */
  1019.     display_q2_player_info,    /* display_player_func */
  1020.     display_server_rules,    /* display_rule_func */
  1021.     raw_display_q2_player_info,    /* display_raw_player_func */
  1022.     raw_display_server_rules,    /* display_raw_rule_func */
  1023.     xml_display_q2_player_info,    /* display_xml_player_func */
  1024.     xml_display_server_rules,    /* display_xml_rule_func */
  1025.     send_qwserver_request_packet,/* status_query_func */
  1026.     NULL,            /* rule_query_func */
  1027.     NULL,            /* player_query_func */
  1028.     deal_with_qw_packet,    /* packet_func */
  1029. },
  1030. {
  1031.     /* GAMESPY PROTOCOL */
  1032.     GAMESPY_PROTOCOL_SERVER,    /* id */
  1033.     "GPS",            /* type_prefix */
  1034.     "gps",            /* type_string */
  1035.     "-gps",            /* type_option */
  1036.     "Gamespy Protocol",        /* game_name */
  1037.     0,                /* master */
  1038.     0,                /* default_port */
  1039.     0,                /* port_offset */
  1040.     TF_SINGLE_QUERY,        /* flags */
  1041.     "gametype",            /* game_rule */
  1042.     "GAMESPYPROTOCOL",        /* template_var */
  1043.     (char*) &unreal_serverstatus,    /* status_packet */
  1044.     sizeof( unreal_serverstatus),    /* status_len */
  1045.     NULL,            /* player_packet */
  1046.     0,                /* player_len */
  1047.     NULL,            /* rule_packet */
  1048.     0,                /* rule_len */
  1049.     NULL,            /* master_packet */
  1050.     0,                /* master_len */
  1051.     NULL,            /* master_protocol */
  1052.     NULL,            /* master_query */
  1053.     display_unreal_player_info,    /* display_player_func */
  1054.     display_server_rules,    /* display_rule_func */
  1055.     raw_display_unreal_player_info,    /* display_raw_player_func */
  1056.     raw_display_server_rules,    /* display_raw_rule_func */
  1057.     xml_display_unreal_player_info,    /* display_xml_player_func */
  1058.     xml_display_server_rules,    /* display_xml_rule_func */
  1059.     send_unreal_request_packet,    /* status_query_func */
  1060.     NULL,            /* rule_query_func */
  1061.     NULL,            /* player_query_func */
  1062.     deal_with_unreal_packet,    /* packet_func */
  1063. },
  1064. {
  1065.     /* TRIBES 2 */
  1066.     TRIBES2_SERVER,        /* id */
  1067.     "T2S",            /* type_prefix */
  1068.     "t2s",            /* type_string */
  1069.     "-t2s",            /* type_option */
  1070.     "Tribes 2",            /* game_name */
  1071.     0,                /* master */
  1072.     TRIBES2_DEFAULT_PORT,    /* default_port */
  1073.     0,                /* port_offset */
  1074.     0,                /* flags */
  1075.     "game",            /* game_rule */
  1076.     "TRIBES2",            /* template_var */
  1077.     (char*) &tribes2_ping,    /* status_packet */
  1078.     sizeof( tribes2_ping),    /* status_len */
  1079.     (char*) &tribes2_info,    /* player_packet */
  1080.     sizeof( tribes2_info),    /* player_len */
  1081.     (char*) NULL,        /* rule_packet */
  1082.     0,                /* rule_len */
  1083.     NULL,            /* master_packet */
  1084.     0,                /* master_len */
  1085.     NULL,            /* master_protocol */
  1086.     NULL,            /* master_query */
  1087.     display_tribes2_player_info,    /* display_player_func */
  1088.     display_server_rules,    /* display_rule_func */
  1089.     raw_display_tribes2_player_info,    /* display_raw_player_func */
  1090.     raw_display_server_rules,    /* display_raw_rule_func */
  1091.     xml_display_tribes2_player_info,    /* display_xml_player_func */
  1092.     xml_display_server_rules,    /* display_xml_rule_func */
  1093.     send_tribes2_request_packet,    /* status_query_func */
  1094.     NULL,            /* rule_query_func */
  1095.     NULL,            /* player_query_func */
  1096.     deal_with_tribes2_packet,    /* packet_func */
  1097. },
  1098. {
  1099.     /* DESCENT3 GAMESPY PROTOCOL */
  1100.     DESCENT3_GAMESPY_SERVER,    /* id */
  1101.     "D3G",            /* type_prefix */
  1102.     "d3g",            /* type_string */
  1103.     "-d3g",            /* type_option */
  1104.     "Descent3 Gamespy Protocol",    /* game_name */
  1105.     0,                /* master */
  1106.     DESCENT3_GAMESPY_DEFAULT_PORT,    /* default_port */
  1107.     0,                /* port_offset */
  1108.     TF_SINGLE_QUERY,        /* flags */
  1109.     "gametype",            /* game_rule */
  1110.     "DESCENT3",            /* template_var */
  1111.     (char*) &unreal_serverstatus,    /* status_packet */
  1112.     sizeof( unreal_serverstatus),    /* status_len */
  1113.     NULL,            /* player_packet */
  1114.     0,                /* player_len */
  1115.     NULL,            /* rule_packet */
  1116.     0,                /* rule_len */
  1117.     NULL,            /* master_packet */
  1118.     0,                /* master_len */
  1119.     NULL,            /* master_protocol */
  1120.     NULL,            /* master_query */
  1121.     display_descent3_player_info,    /* display_player_func */
  1122.     display_server_rules,    /* display_rule_func */
  1123.     raw_display_descent3_player_info,    /* display_raw_player_func */
  1124.     raw_display_server_rules,    /* display_raw_rule_func */
  1125.     xml_display_descent3_player_info,    /* display_xml_player_func */
  1126.     xml_display_server_rules,    /* display_xml_rule_func */
  1127.     send_unreal_request_packet,    /* status_query_func */
  1128.     NULL,            /* rule_query_func */
  1129.     NULL,            /* player_query_func */
  1130.     deal_with_unreal_packet,    /* packet_func */
  1131. },
  1132. {
  1133.     /* DESCENT3 PROTOCOL */
  1134.     DESCENT3_SERVER,        /* id */
  1135.     "D3S",            /* type_prefix */
  1136.     "d3s",            /* type_string */
  1137.     "-d3s",            /* type_option */
  1138.     "Descent3",            /* game_name */
  1139.     0,                /* master */
  1140.     DESCENT3_DEFAULT_PORT,    /* default_port */
  1141.     0,                /* port_offset */
  1142.     0,                /* flags */
  1143.     "gametype",            /* game_rule */
  1144.     "DESCENT3",            /* template_var */
  1145.     (char*) &descent3_tcpipinfoquery,    /* status_packet */
  1146.     sizeof( descent3_tcpipinfoquery),    /* status_len */
  1147.     (char*) &descent3_playerquery,    /* status_packet */
  1148.     sizeof( descent3_playerquery),    /* status_len */
  1149.     NULL,            /* rule_packet */
  1150.     0,                /* rule_len */
  1151.     NULL,            /* master_packet */
  1152.     0,                /* master_len */
  1153.     NULL,            /* master_protocol */
  1154.     NULL,            /* master_query */
  1155.     display_descent3_player_info,    /* display_player_func */
  1156.     display_server_rules,    /* display_rule_func */
  1157.     raw_display_descent3_player_info,    /* display_raw_player_func */
  1158.     raw_display_server_rules,    /* display_raw_rule_func */
  1159.     xml_display_descent3_player_info,    /* display_xml_player_func */
  1160.     xml_display_server_rules,    /* display_xml_rule_func */
  1161.     send_unreal_request_packet,    /* status_query_func */
  1162.     NULL,            /* rule_query_func */
  1163.     NULL,            /* player_query_func */
  1164.     deal_with_descent3_packet,    /* packet_func */
  1165. },
  1166. {
  1167.     /* DESCENT3 PROTOCOL */
  1168.     DESCENT3_PXO_SERVER,    /* id */
  1169.     "D3P",            /* type_prefix */
  1170.     "d3p",            /* type_string */
  1171.     "-d3p",            /* type_option */
  1172.     "Descent3 PXO protocol",    /* game_name */
  1173.     0,                /* master */
  1174.     DESCENT3_DEFAULT_PORT,    /* default_port */
  1175.     0,                /* port_offset */
  1176.     0,                /* flags */
  1177.     "gametype",            /* game_rule */
  1178.     "DESCENT3",            /* template_var */
  1179.     (char*) &descent3_pxoinfoquery,    /* status_packet */
  1180.     sizeof( descent3_pxoinfoquery),    /* status_len */
  1181.     (char*) &descent3_playerquery,    /* status_packet */
  1182.     sizeof( descent3_playerquery),    /* status_len */
  1183.     NULL,            /* rule_packet */
  1184.     0,                /* rule_len */
  1185.     NULL,            /* master_packet */
  1186.     0,                /* master_len */
  1187.     NULL,            /* master_protocol */
  1188.     NULL,            /* master_query */
  1189.     display_descent3_player_info,    /* display_player_func */
  1190.     display_server_rules,    /* display_rule_func */
  1191.     raw_display_descent3_player_info,    /* display_raw_player_func */
  1192.     raw_display_server_rules,    /* display_raw_rule_func */
  1193.     xml_display_descent3_player_info,    /* display_xml_player_func */
  1194.     xml_display_server_rules,    /* display_xml_rule_func */
  1195.     send_unreal_request_packet,    /* status_query_func */
  1196.     NULL,            /* rule_query_func */
  1197.     NULL,            /* player_query_func */
  1198.     deal_with_descent3_packet,    /* packet_func */
  1199. },
  1200.  
  1201.  
  1202. /* --- MASTER SERVERS --- */
  1203. {
  1204.     /* QUAKE WORLD MASTER */
  1205.     QW_MASTER,            /* id */
  1206.     "QWM",            /* type_prefix */
  1207.     "qwm",            /* type_string */
  1208.     "-qwm",            /* type_option */ /* ## also "-qw" */
  1209.     "QuakeWorld Master",    /* game_name */
  1210.     QW_SERVER,            /* master */
  1211.     QW_MASTER_DEFAULT_PORT,    /* default_port */
  1212.     0,                /* port_offset */
  1213.     TF_SINGLE_QUERY|TF_OUTFILE,    /* flags */
  1214.     "",                /* game_rule */
  1215.     "QWMASTER",            /* template_var */
  1216.     NULL,            /* status_packet */
  1217.     0,                /* status_len */
  1218.     NULL,            /* player_packet */
  1219.     0,                /* player_len */
  1220.     NULL,            /* rule_packet */
  1221.     0,                /* rule_len */
  1222.     (char*) &qw_masterquery,    /* master_packet */
  1223.     sizeof( qw_masterquery),    /* master_len */
  1224.     NULL,            /* master_protocol */
  1225.     NULL,            /* master_query */
  1226.     display_qwmaster,        /* display_player_func */
  1227.     NULL,    /* display_rule_func */
  1228.     NULL,    /* display_raw_player_func */
  1229.     NULL,    /* display_raw_rule_func */
  1230.     NULL,    /* display_xml_player_func */
  1231.     NULL,    /* display_xml_rule_func */
  1232.     send_qwmaster_request_packet,/* status_query_func */
  1233.     NULL,            /* rule_query_func */
  1234.     NULL,            /* player_query_func */
  1235.     deal_with_qwmaster_packet,    /* packet_func */
  1236. },
  1237. {
  1238.     /* QUAKE 2 MASTER */
  1239.     Q2_MASTER,            /* id */
  1240.     "Q2M",            /* type_prefix */
  1241.     "q2m",            /* type_string */
  1242.     "-q2m",            /* type_option */ /* ## also "-qw" */
  1243.     "Quake II Master",        /* game_name */
  1244.     Q2_SERVER,            /* master */
  1245.     Q2_MASTER_DEFAULT_PORT,    /* default_port */
  1246.     0,                /* port_offset */
  1247.     TF_SINGLE_QUERY|TF_OUTFILE,    /* flags */
  1248.     "",                /* game_rule */
  1249.     "Q2MASTER",            /* template_var */
  1250.     NULL,            /* status_packet */
  1251.     0,                /* status_len */
  1252.     NULL,            /* player_packet */
  1253.     0,                /* player_len */
  1254.     NULL,            /* rule_packet */
  1255.     0,                /* rule_len */
  1256.     q2_masterquery,        /* master_packet */
  1257.     sizeof( q2_masterquery),    /* master_len */
  1258.     NULL,            /* master_protocol */
  1259.     NULL,            /* master_query */
  1260.     display_qwmaster,        /* display_player_func */
  1261.     NULL,    /* display_rule_func */
  1262.     NULL,    /* display_raw_player_func */
  1263.     NULL,    /* display_raw_rule_func */
  1264.     NULL,    /* display_xml_player_func */
  1265.     NULL,    /* display_xml_rule_func */
  1266.     send_qwmaster_request_packet,/* status_query_func */
  1267.     NULL,            /* rule_query_func */
  1268.     NULL,            /* player_query_func */
  1269.     deal_with_qwmaster_packet,    /* packet_func */
  1270. },
  1271. {
  1272.     /* QUAKE 3 MASTER */
  1273.     Q3_MASTER,            /* id */
  1274.     "Q3M",            /* type_prefix */
  1275.     "q3m",            /* type_string */
  1276.     "-q3m",            /* type_option */
  1277.     "Quake III Master",        /* game_name */
  1278.     Q3_SERVER,            /* master */
  1279.     Q3_MASTER_DEFAULT_PORT,    /* default_port */
  1280.     0,                /* port_offset */
  1281.     TF_OUTFILE | TF_QUERY_ARG,    /* flags */
  1282.     "",                /* game_rule */
  1283.     "Q3MASTER",            /* template_var */
  1284.     NULL,            /* status_packet */
  1285.     0,                /* status_len */
  1286.     NULL,            /* player_packet */
  1287.     0,                /* player_len */
  1288.     NULL,            /* rule_packet */
  1289.     0,                /* rule_len */
  1290.     q3_master_query_template,    /* master_packet */
  1291.     0,                /* master_len */
  1292.     q3_master_default_protocol,    /* master_protocol */
  1293.     q3_master_default_query,    /* master_query */
  1294.     display_qwmaster,        /* display_player_func */
  1295.     NULL,    /* display_rule_func */
  1296.     NULL,    /* display_raw_player_func */
  1297.     NULL,    /* display_raw_rule_func */
  1298.     NULL,    /* display_xml_player_func */
  1299.     NULL,    /* display_xml_rule_func */
  1300.     send_qwmaster_request_packet,/* status_query_func */
  1301.     NULL,            /* rule_query_func */
  1302.     NULL,            /* player_query_func */
  1303.     deal_with_qwmaster_packet,    /* packet_func */
  1304. },
  1305. {
  1306.     /* RETURN TO CASTLE WOLFENSTEIN MASTER */
  1307.     RTCW_MASTER,        /* id */
  1308.     "RWM",            /* type_prefix */
  1309.     "rwm",            /* type_string */
  1310.     "-rwm",            /* type_option */
  1311.     "Return to Castle Wolfenstein Master",    /* game_name */
  1312.     RTCW_SERVER,        /* master */
  1313.     RTCW_MASTER_DEFAULT_PORT,    /* default_port */
  1314.     0,                /* port_offset */
  1315.     TF_OUTFILE | TF_QUERY_ARG,    /* flags */
  1316.     "",                /* game_rule */
  1317.     "RTCWMASTER",        /* template_var */
  1318.     NULL,            /* status_packet */
  1319.     0,                /* status_len */
  1320.     NULL,            /* player_packet */
  1321.     0,                /* player_len */
  1322.     NULL,            /* rule_packet */
  1323.     0,                /* rule_len */
  1324.     q3_master_query_template,    /* master_packet */
  1325.     0,                /* master_len */
  1326.     rtcw_master_default_protocol,    /* master_protocol */
  1327.     q3_master_default_query,        /* master_query */
  1328.     display_qwmaster,        /* display_player_func */
  1329.     NULL,    /* display_rule_func */
  1330.     NULL,    /* display_raw_player_func */
  1331.     NULL,    /* display_raw_rule_func */
  1332.     NULL,    /* display_xml_player_func */
  1333.     NULL,    /* display_xml_rule_func */
  1334.     send_qwmaster_request_packet,/* status_query_func */
  1335.     NULL,            /* rule_query_func */
  1336.     NULL,            /* player_query_func */
  1337.     deal_with_qwmaster_packet,    /* packet_func */
  1338. },
  1339. {
  1340.     /* STAR TREK: ELITE FORCE MASTER */
  1341.     STEF_MASTER,        /* id */
  1342.     "EFM",            /* type_prefix */
  1343.     "efm",            /* type_string */
  1344.     "-efm",            /* type_option */
  1345.     "Star Trek: Elite Force",    /* game_name */
  1346.     STEF_SERVER,        /* master */
  1347.     STEF_MASTER_DEFAULT_PORT,    /* default_port */
  1348.     0,                /* port_offset */
  1349.     TF_OUTFILE | TF_QUERY_ARG,    /* flags */
  1350.     "",                /* game_rule */
  1351.     "ELITEFORCEMASTER",        /* template_var */
  1352.     NULL,            /* status_packet */
  1353.     0,                /* status_len */
  1354.     NULL,            /* player_packet */
  1355.     0,                /* player_len */
  1356.     NULL,            /* rule_packet */
  1357.     0,                /* rule_len */
  1358.     q3_master_query_template,    /* master_packet */
  1359.     0,                /* master_len */
  1360.     stef_master_default_protocol,    /* master_protocol */
  1361.     q3_master_default_query,        /* master_query */
  1362.     display_qwmaster,        /* display_player_func */
  1363.     NULL,    /* display_rule_func */
  1364.     NULL,    /* display_raw_player_func */
  1365.     NULL,    /* display_raw_rule_func */
  1366.     NULL,    /* display_xml_player_func */
  1367.     NULL,    /* display_xml_rule_func */
  1368.     send_qwmaster_request_packet,/* status_query_func */
  1369.     NULL,            /* rule_query_func */
  1370.     NULL,            /* player_query_func */
  1371.     deal_with_qwmaster_packet,    /* packet_func */
  1372. },
  1373. {
  1374.     /* HALF-LIFE MASTER */
  1375.     HL_MASTER,            /* id */
  1376.     "HLM",            /* type_prefix */
  1377.     "hlm",            /* type_string */
  1378.     "-hlm",            /* type_option */ /* ## also "-qw" */
  1379.     "Half-Life Master",        /* game_name */
  1380.     HL_SERVER,            /* master */
  1381.     HL_MASTER_DEFAULT_PORT,    /* default_port */
  1382.     0,                /* port_offset */
  1383.     TF_SINGLE_QUERY|TF_OUTFILE|TF_QUERY_ARG, /* flags */
  1384.     "",                /* game_rule */
  1385.     "HLMASTER",            /* template_var */
  1386.     NULL,            /* status_packet */
  1387.     0,                /* status_len */
  1388.     NULL,            /* player_packet */
  1389.     0,                /* player_len */
  1390.     NULL,            /* rule_packet */
  1391.     0,                /* rule_len */
  1392.     (char*) &new_hl_masterquery_prefix,    /* master_packet */
  1393.     sizeof( new_hl_masterquery_prefix),    /* master_len */
  1394.     NULL,            /* master_protocol */
  1395.     NULL,            /* master_query */
  1396.     display_qwmaster,        /* display_player_func */
  1397.     NULL,    /* display_rule_func */
  1398.     NULL,    /* display_raw_player_func */
  1399.     NULL,    /* display_raw_rule_func */
  1400.     NULL,    /* display_xml_player_func */
  1401.     NULL,    /* display_xml_rule_func */
  1402.     send_qwmaster_request_packet,/* status_query_func */
  1403.     NULL,            /* rule_query_func */
  1404.     NULL,            /* player_query_func */
  1405.     deal_with_qwmaster_packet,    /* packet_func */
  1406. },
  1407. {
  1408.     /* TRIBES MASTER */
  1409.     TRIBES_MASTER,        /* id */
  1410.     "TBM",            /* type_prefix */
  1411.     "tbm",            /* type_string */
  1412.     "-tbm",            /* type_option */
  1413.     "Tribes Master",        /* game_name */
  1414.     TRIBES_SERVER,        /* master */
  1415.     TRIBES_MASTER_DEFAULT_PORT,    /* default_port */
  1416.     0,                /* port_offset */
  1417.     TF_OUTFILE,            /* flags */
  1418.     "",                /* game_rule */
  1419.     "TRIBESMASTER",        /* template_var */
  1420.     NULL,            /* status_packet */
  1421.     0,                /* status_len */
  1422.     NULL,            /* player_packet */
  1423.     0,                /* player_len */
  1424.     NULL,            /* rule_packet */
  1425.     0,                /* rule_len */
  1426.     (char*) &tribes_masterquery,/* master_packet */
  1427.     sizeof( tribes_masterquery),/* master_len */
  1428.     NULL,            /* master_protocol */
  1429.     NULL,            /* master_query */
  1430.     display_qwmaster,        /* display_player_func */
  1431.     NULL,    /* display_rule_func */
  1432.     NULL,    /* display_raw_player_func */
  1433.     NULL,    /* display_raw_rule_func */
  1434.     NULL,    /* display_xml_player_func */
  1435.     NULL,    /* display_xml_rule_func */
  1436.     send_qwmaster_request_packet,/* status_query_func */
  1437.     NULL,            /* rule_query_func */
  1438.     NULL,            /* player_query_func */
  1439.     deal_with_tribesmaster_packet,/* packet_func */
  1440. },
  1441. {
  1442.     /* GAMESPY MASTER */
  1443.     GAMESPY_MASTER,        /* id */
  1444.     "GSM",            /* type_prefix */
  1445.     "gsm",            /* type_string */
  1446.     "-gsm",            /* type_option */
  1447.     "Gamespy Master",        /* game_name */
  1448.     GAMESPY_PROTOCOL_SERVER,    /* master */
  1449.     GAMESPY_MASTER_DEFAULT_PORT,        /* default_port */
  1450.     0,                /* port_offset */
  1451.     TF_OUTFILE | TF_TCP_CONNECT | TF_QUERY_ARG | TF_QUERY_ARG_REQUIRED,    /* flags */
  1452.     "",                /* game_rule */
  1453.     "GAMESPYMASTER",        /* template_var */
  1454.     (char*) &gamespy_master_request_prefix,    /* status_packet */
  1455.     sizeof( gamespy_master_request_prefix)-1,    /* status_len */
  1456.     NULL,            /* player_packet */
  1457.     0,                /* player_len */
  1458.     NULL,            /* rule_packet */
  1459.     0,                /* rule_len */
  1460.     (char*) &gamespy_master_validate,/* master_packet */
  1461.     sizeof( gamespy_master_validate)-1,/* master_len */
  1462.     NULL,            /* master_protocol */
  1463.     NULL,            /* master_query */
  1464.     display_qwmaster,        /* display_player_func */
  1465.     NULL,    /* display_rule_func */
  1466.     NULL,    /* display_raw_player_func */
  1467.     NULL,    /* display_raw_rule_func */
  1468.     NULL,    /* display_xml_player_func */
  1469.     NULL,    /* display_xml_rule_func */
  1470.     send_gamespy_master_request,/* status_query_func */
  1471.     NULL,            /* rule_query_func */
  1472.     NULL,            /* player_query_func */
  1473.     deal_with_gamespy_master_response,/* packet_func */
  1474. },
  1475. {
  1476.     /* TRIBES 2 MASTER */
  1477.     TRIBES2_MASTER,        /* id */
  1478.     "T2M",            /* type_prefix */
  1479.     "t2m",            /* type_string */
  1480.     "-t2m",            /* type_option */
  1481.     "Tribes 2 Master",        /* game_name */
  1482.     TRIBES2_SERVER,        /* master */
  1483.     TRIBES2_MASTER_DEFAULT_PORT,    /* default_port */
  1484.     0,                /* port_offset */
  1485.     TF_OUTFILE | TF_QUERY_ARG,    /* flags */
  1486.     "",                /* game_rule */
  1487.     "TRIBES2MASTER",        /* template_var */
  1488.     NULL,            /* status_packet */
  1489.     0,                /* status_len */
  1490.     NULL,            /* player_packet */
  1491.     0,                /* player_len */
  1492.     NULL,            /* rule_packet */
  1493.     0,                /* rule_len */
  1494.     (char*) &tribes2_masterquery,/* master_packet */
  1495.     sizeof( tribes2_masterquery),/* master_len */
  1496.     NULL,            /* master_protocol */
  1497.     NULL,            /* master_query */
  1498.     display_qwmaster,        /* display_player_func */
  1499.     NULL,    /* display_rule_func */
  1500.     NULL,    /* display_raw_player_func */
  1501.     NULL,    /* display_raw_rule_func */
  1502.     NULL,    /* display_xml_player_func */
  1503.     NULL,    /* display_xml_rule_func */
  1504.     send_tribes2master_request_packet,/* status_query_func */
  1505.     NULL,            /* rule_query_func */
  1506.     NULL,            /* player_query_func */
  1507.     deal_with_tribes2master_packet,/* packet_func */
  1508. },
  1509. {
  1510.     /* DESCENT3 MASTER */
  1511.     DESCENT3_MASTER,        /* id */
  1512.     "D3M",            /* type_prefix */
  1513.     "d3m",            /* type_string */
  1514.     "-d3m",            /* type_option */ /* ## also "-qw" */
  1515.     "Descent3 Master (PXO)",    /* game_name */
  1516.     DESCENT3_PXO_SERVER,    /* master */
  1517.     DESCENT3_MASTER_DEFAULT_PORT,    /* default_port */
  1518.     0,                /* port_offset */
  1519.     TF_MASTER_MULTI_RESPONSE|TF_OUTFILE,    /* flags */
  1520.     "",                /* game_rule */
  1521.     "D3MASTER",            /* template_var */
  1522.     NULL,            /* status_packet */
  1523.     0,                /* status_len */
  1524.     NULL,            /* player_packet */
  1525.     0,                /* player_len */
  1526.     NULL,            /* rule_packet */
  1527.     0,                /* rule_len */
  1528.     (char*)descent3_masterquery,    /* master_packet */
  1529.     sizeof( descent3_masterquery),    /* master_len */
  1530.     NULL,            /* master_protocol */
  1531.     NULL,            /* master_query */
  1532.     display_qwmaster,        /* display_player_func */
  1533.     NULL,    /* display_rule_func */
  1534.     NULL,    /* display_raw_player_func */
  1535.     NULL,    /* display_raw_rule_func */
  1536.     NULL,    /* display_xml_player_func */
  1537.     NULL,    /* display_xml_rule_func */
  1538.     send_qwmaster_request_packet,/* status_query_func */
  1539.     NULL,            /* rule_query_func */
  1540.     NULL,            /* player_query_func */
  1541.     deal_with_descent3master_packet,    /* packet_func */
  1542. },
  1543. {
  1544.     Q_UNKNOWN_TYPE,        /* id */
  1545.     "",                /* type_prefix */
  1546.     "",                /* type_string */
  1547.     "",                /* type_option */
  1548.     "",                /* game_name */
  1549.     0,                /* master */
  1550.     0,                /* default_port */
  1551.     0,                /* port_offset */
  1552.     0,                /* flags */
  1553.     "",                /* game_rule */
  1554.     "",                /* template_var */
  1555.     NULL,            /* status_packet */
  1556.     0,                /* status_len */
  1557.     NULL,            /* player_packet */
  1558.     0,                /* player_len */
  1559.     NULL,            /* rule_packet */
  1560.     0,                /* rule_len */
  1561.     (char*) NULL,        /* master_packet */
  1562.     0,                /* master_len */
  1563.     NULL,            /* display_player_func */
  1564.     NULL,            /* display_rule_func */
  1565.     NULL,            /* display_raw_player_func */
  1566.     NULL,            /* display_raw_rule_func */
  1567.     NULL,            /* display_xml_player_func */
  1568.     NULL,            /* display_xml_rule_func */
  1569.     NULL,            /* status_query_func */
  1570.     NULL,            /* rule_query_func */
  1571.     NULL,            /* player_query_func */
  1572.     NULL,            /* packet_func */
  1573. }
  1574. };
  1575.  
  1576. #endif /* QUERY_PACKETS */
  1577.  
  1578. /* Structures for keeping information about Quake servers, server
  1579.  * rules, and players.
  1580.  */
  1581.  
  1582. struct player;
  1583.  
  1584. #define FLAG_BROADCAST        (1<<1)
  1585. #define FLAG_PLAYER_TEAMS    (1<<2)
  1586.  
  1587. struct query_param  {
  1588.     char *key;
  1589.     char *value;
  1590.     int i_value;
  1591.     unsigned int ui_value;
  1592.     struct query_param *next;
  1593. };
  1594.  
  1595. typedef struct SavedData  {
  1596.     char *data;
  1597.     int datalen;
  1598.     int pkt_index;
  1599.     int pkt_max;
  1600.     unsigned int pkt_id;
  1601.     struct SavedData *next;
  1602. } SavedData;
  1603.  
  1604. struct qserver {
  1605.     char *arg;
  1606.     char *host_name;
  1607.     unsigned int ipaddr;
  1608.     int flags;
  1609.     server_type * type;
  1610.     int fd;
  1611.     char *outfilename;
  1612.     char *query_arg;
  1613.     struct query_param *params;
  1614.     unsigned short port;
  1615.     int retry1;
  1616.     int retry2;
  1617.     int n_retries;
  1618.     struct timeval packet_time1;
  1619.     struct timeval packet_time2;
  1620.     int ping_total;        /* average is ping_total / n_requests */
  1621.     int n_requests;
  1622.     int n_packets;
  1623.  
  1624.     int n_servers;
  1625.     int master_pkt_len;
  1626.     char *master_pkt;
  1627.     char master_query_tag[4];
  1628.     char *error;
  1629.  
  1630.     char *server_name;
  1631.     char *address;
  1632.     char *map_name;
  1633.     char *game;
  1634.     int max_players;
  1635.     int num_players;
  1636.     int protocol_version;
  1637.  
  1638.     SavedData saved_data;
  1639.  
  1640.     int next_player_info;
  1641.     int n_player_info;
  1642.     struct player *players;
  1643.  
  1644.     char *next_rule;
  1645.     int n_rules;
  1646.     struct rule *rules;
  1647.     struct rule **last_rule;
  1648.     int missing_rules;
  1649.  
  1650.     struct qserver *next;
  1651. };
  1652.  
  1653. #define PLAYER_TYPE_NORMAL    1
  1654. #define PLAYER_TYPE_BOT        2
  1655. #define PLAYER_TYPE_ALIAS    4
  1656.  
  1657. struct player  {
  1658.     int number;
  1659.     char *name;
  1660.     int frags;
  1661.     int team;        /* Unreal and Tribes only */
  1662.     char *team_name;    /* Tribes, BFRIS only, do not free()  */
  1663.     int connect_time;
  1664.     int shirt_color;
  1665.     int pants_color;
  1666.     char *address;
  1667.     int ping;
  1668.     int packet_loss;    /* Tribes only */
  1669.     int type_flag;    /* Tribes 2 only */
  1670.     char * tribe_tag;    /* Tribes 2 only */
  1671.     char *skin;
  1672.     char *mesh;        /* Unreal only */
  1673.     char *face;        /* Unreal only */
  1674.     int score;        /* BFRIS only */
  1675.     int ship;        /* BFRIS only */
  1676.     int room;        /* BFRIS only */
  1677.     int deaths;        /* Descent3 only */
  1678.     struct player *next;
  1679. };
  1680.  
  1681. struct rule  {
  1682.     char *name;
  1683.     char *value;
  1684.     struct rule *next;
  1685. };
  1686.  
  1687. extern char *qstat_version;
  1688. extern char *DOWN;
  1689. extern char *SYSERROR;
  1690. extern char *TIMEOUT;
  1691. extern char *MASTER;
  1692. extern char *SERVERERROR;
  1693. extern char *HOSTNOTFOUND;
  1694.  
  1695. #define DEFAULT_RETRIES            3
  1696. #define DEFAULT_RETRY_INTERVAL        500    /* milli-seconds */
  1697. #define MAXFD_DEFAULT            20
  1698.  
  1699. #define SORT_GAME        1
  1700. #define SORT_PING        2
  1701. extern int first_sort_key;
  1702. extern int second_sort_key;
  1703.  
  1704. #define SECONDS 0
  1705. #define CLOCK_TIME 1
  1706. #define STOPWATCH_TIME 2
  1707. #define DEFAULT_TIME_FMT_RAW            SECONDS
  1708. #define DEFAULT_TIME_FMT_DISPLAY        CLOCK_TIME
  1709. extern int time_format;
  1710.  
  1711. extern int color_names;
  1712.  
  1713.  
  1714. /* Definitions for the original Quake network protocol.
  1715.  */
  1716.  
  1717. #define PACKET_LEN 0xffff
  1718.  
  1719. /* Quake packet formats and magic numbers
  1720.  */
  1721. struct qheader  {
  1722.     unsigned char flag1;
  1723.     unsigned char flag2;
  1724.     unsigned short length;
  1725.     unsigned char op_code;
  1726. };
  1727.  
  1728. #define Q_NET_PROTOCOL_VERSION    3
  1729. #define HEXEN2_NET_PROTOCOL_VERSION    4
  1730.  
  1731. #define Q_CCREQ_CONNECT        0x01
  1732. #define Q_CCREP_ACCEPT        0x81
  1733. #define Q_CCREP_REJECT        0x82
  1734.  
  1735. #define Q_CCREP_SERVER_INFO    0x83
  1736.  
  1737. #define Q_CCREP_PLAYER_INFO    0x84
  1738.  
  1739. #define Q_CCREP_RULE_INFO    0x85
  1740.  
  1741. #define Q_DEFAULT_SV_MAXSPEED    "320"
  1742. #define Q_DEFAULT_SV_FRICTION    "4"
  1743. #define Q_DEFAULT_SV_GRAVITY    "800"
  1744. #define Q_DEFAULT_NOEXIT    "0"
  1745. #define Q_DEFAULT_TEAMPLAY    "0"
  1746. #define Q_DEFAULT_TIMELIMIT    "0"
  1747. #define Q_DEFAULT_FRAGLIMIT    "0"
  1748.  
  1749.  
  1750. /* Definitions for the QuakeWorld network protocol
  1751.  */
  1752.  
  1753.  
  1754. /*
  1755. #define QW_GET_SERVERS    'c'
  1756. */
  1757. #define QW_SERVERS        'd'
  1758. #define HL_SERVERS        'f'
  1759. /*
  1760. HL master: send 'a', master responds with a small 'l' packet containing
  1761.     the text "Outdated protocol"
  1762. HL master: send 'e', master responds with a small 'f' packet
  1763. HL master: send 'g', master responds with a small 'h' packet containing
  1764.     name of master server
  1765. HL master: send 'i', master responds with a small 'j' packet
  1766. */
  1767. #define QW_GET_USERINFO   'o'
  1768. #define QW_USERINFO       'p'
  1769. #define QW_GET_SEENINFO   'u'
  1770. #define QW_SEENINFO       'v'
  1771. #define QW_NACK           'm'
  1772. #define QW_NEWLINE        '\n'
  1773. #define QW_RULE_SEPARATOR '\\'
  1774.  
  1775. #define QW_REQUEST_LENGTH 20
  1776.  
  1777. int is_default_rule( struct rule *rule);
  1778. char *xform_name( char*, struct qserver *server);
  1779. char *quake_color( int color);
  1780. char *play_time( int seconds, int show_seconds);
  1781. char *ping_time( int ms);
  1782. char *get_qw_game( struct qserver *server);
  1783.  
  1784.  
  1785. /* Query status and packet handling functions
  1786.  */
  1787.  
  1788. void cleanup_qserver( struct qserver *server, int force);
  1789.  
  1790. int server_info_packet( struct qserver *server, struct q_packet *pkt,
  1791.         int datalen);
  1792. int player_info_packet( struct qserver *server, struct q_packet *pkt,
  1793.         int datalen);
  1794. int rule_info_packet( struct qserver *server, struct q_packet *pkt,
  1795.     int datalen);
  1796.  
  1797. int time_delta( struct timeval *later, struct timeval *past);
  1798. char * strherror( int h_err);
  1799. int connection_refused();
  1800.  
  1801. void add_file( char *filename);
  1802. int add_qserver( char *arg, server_type* type, char *outfilename, char *query_arg);
  1803. struct qserver* add_qserver_byaddr( unsigned int ipaddr, unsigned short port,
  1804.     server_type* type, int *new_server);
  1805. void init_qserver( struct qserver *server);
  1806. int bind_qserver( struct qserver *server);
  1807. int bind_sockets();
  1808. void send_packets();
  1809. struct qserver * find_server_by_address( unsigned int ipaddr, unsigned short port);
  1810. void add_server_to_hash( struct qserver *server);
  1811.  
  1812.  
  1813.  
  1814. void print_packet( struct qserver *server, char *buf, int buflen);
  1815.  
  1816.  
  1817. /*
  1818.  * Output template stuff
  1819.  */
  1820.  
  1821. int read_qserver_template( char *filename);
  1822. int read_rule_template( char *filename);
  1823. int read_header_template( char *filename);
  1824. int read_trailer_template( char *filename);
  1825. int read_player_template( char *filename);
  1826. int have_server_template();
  1827. int have_header_template();
  1828. int have_trailer_template();
  1829.  
  1830. void template_display_server( struct qserver *server);
  1831. void template_display_header();
  1832. void template_display_trailer();
  1833. void template_display_players( struct qserver *server);
  1834. void template_display_player( struct qserver *server, struct player *player);
  1835. void template_display_rules( struct qserver *server);
  1836. void template_display_rule( struct qserver *server, struct rule *rule);
  1837.  
  1838.  
  1839.  
  1840. /*
  1841.  * Host cache stuff
  1842.  */
  1843.  
  1844. int hcache_open( char *filename, int update);
  1845. void hcache_write( char *filename);
  1846. void hcache_invalidate();
  1847. void hcache_validate();
  1848. unsigned long hcache_lookup_hostname( char *hostname);
  1849. char * hcache_lookup_ipaddr( unsigned long ipaddr);
  1850. void hcache_write_file( char *filename);
  1851. void hcache_update_file();
  1852.  
  1853. #endif
  1854.